package com.myutils;

import java.io.File;
import java.util.Date;

import org.apache.log4j.Logger;

import com.opensymphony.oscache.base.NeedsRefreshException;
import com.opensymphony.oscache.general.GeneralCacheAdministrator;

/**
 * @author Lan
 * @Company 上海全景数字技术有限公司
 */
public class CacheManager extends GeneralCacheAdministrator {

	private Logger logger = Logger.getLogger(CacheManager.class);

	private static final long serialVersionUID = 8551415555670656885L;

	private static CacheManager instance;

	// 过期时间(单位为秒);
	private int refreshPeriod = 24 * 60 * 60;

	private CacheManager() {
	}

	synchronized public static CacheManager getInstance() {
		if (instance == null)
			instance = new CacheManager();
		return instance;
	}

	/**
	 * 判断缓存中的内容是否有更新，有更新则更新缓存
	 * 
	 * @param key
	 *            缓存的key值
	 * @param lastModified
	 *            实际最后修改时间
	 * @return
	 */
	public Boolean isModified(String key, Long lastModified) {
		Boolean isUpdate = false;// 文件内容无更新
		if (lastModified != null) {
			Long cacheLastModified = null;
			try {
				// 读取缓存中该文件的更新时间
				cacheLastModified = (Long) this.get(key);

				if (lastModified.compareTo(cacheLastModified) > 0) {
					// 缓存中的时间小，则文件内容有更新
					logger.debug(key + "有更新，更新缓存");
					isUpdate = true;
					this.putInCache(key, lastModified);// 更新缓存
				} else {
					logger.debug(key + "没有更新");
				}
			} catch (NeedsRefreshException e) {
				// 该文件未缓存，则放入缓存<文件路径, 最后修改时间>
				logger.debug(key + "还未缓存，放入缓存中");
				this.putInCache(key, lastModified);
				cacheLastModified = lastModified;
			}
		}
		return isUpdate;
	}

	public Boolean isFileModified(String filePath) {
		Long lastModified = new File(filePath).lastModified();
		return isModified(filePath, lastModified);
	}

	/**
	 * 删除被缓存的对象
	 * 
	 * @author Lan
	 * @param key
	 */
	public void remove(String key) {
		logger.debug("删除缓存的对象[key=" + key +"]");
		this.flushEntry(key);
	}

	/**
	 * 删除所有被缓存的对象
	 * 
	 * @author Lan
	 * @param date
	 */
	public void removeAll(Date date) {
		logger.debug("删除指定日期的所有缓存对象");
		this.flushAll(date);
	}

	/**
	 * 删除所有被缓存的对象
	 * 
	 * @author Lan
	 */
	public void removeAll() {
		logger.debug("删除所有的缓存对象");
		this.flushAll();
	}

	/**
	 * 根据key值从缓存中获取内容，使用默认的刷新时间refreshPeriod
	 * @author Lan
	 * @param key
	 * @return
	 * @throws NeedsRefreshException
	 */
	public Object get(String key) throws NeedsRefreshException {
		try {
			return getFromCache(key, refreshPeriod);
		} catch (NeedsRefreshException e) {
			// 缓存中不存在该key的内容，或内容已经过期
			this.cancelUpdate(key);// 取消对key的更新 即类似数据回滚
			logger.error("读取缓存数据时出现异常[key=" + key + "] : " + e.getMessage());
			throw e;
		}
	}

	public int getRefreshPeriod() {
		return refreshPeriod;
	}

	public void setRefreshPeriod(int refreshPeriod) {
		this.refreshPeriod = refreshPeriod;
	}
	
}
